package org.ttitfly.workflow.engine.mode;

import java.util.ArrayList;
import java.util.List;

import org.ttitfly.workflow.engine.Process;
import org.ttitfly.workflow.engine.Transition;
import org.ttitfly.workflow.engine.VirtualRunUnit;
import org.ttitfly.workflow.exception.ProcessRunException;


/**
 * <pre>
 * 决策节点，通过决策判断决定执调度哪个后续节点，最多有一个后续条件满足条件， 
 * 否则将调度第一个满足条件的指向，如果没有满足条件的转向，则检测流程是否完成。
 * </pre>
 * 
 * @author 潘海春
 * @version 2009-9-10
 */
public class Decision extends VirtualRunUnit {

	/**
	 * 默认
	 */
	private String defaultTo;

	/**
	 * 所有待鉴别的转向
	 */
	private List<Transition> transitions = new ArrayList<Transition>();

	/**
	 * 构造函数
	 * 
	 * @param parent
	 * @param name
	 * @param defaultTo
	 * @param transitions
	 */
	public Decision(Process parent, String name, String defaultTo, List<Transition> transitions) {
		super(parent, name);
		if (transitions == null || transitions.isEmpty()) {
			throw new IllegalArgumentException("参数[transitions]不能为空！");
		}
		if (defaultTo != null && !"".equals(defaultTo)) {
			this.defaultTo = defaultTo;
		}
		this.transitions = transitions;
	}

	@Override
	public void run() throws ProcessRunException {
		for (Transition transition : transitions) {
			if (transition.isEffective()) {
				// 选择第一个满足条件的转向
				parent.dispatch(transition.getTarget());
				return;
			}
		}
		if (defaultTo != null) {
			parent.dispatch(defaultTo);
		} else {
			parent.checkComplete();
		}
	}
}
